package com.rp.dao.remote;

import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.TimeZone;

import com.rp.dao.IProdutoDAO;
import com.rp.dao.ResultSetProcessor;
import com.rp.model.Produto;

public class ProdutoDAO extends AbstractDB implements IProdutoDAO {

    private static ProdutoDAO INSTANCE;

    private ProdutoDAO() {
    }

    public static ProdutoDAO get() {
	if (INSTANCE == null) {
	    INSTANCE = new ProdutoDAO();
	}
	return INSTANCE;
    }

    @Override
    public Produto buscarPorCodigoBarras(long codigo) throws Throwable {
	Produto p = null;
	preparedStatement = ConnectionFactory.get().createStatement();
	try {
	    resultSet = preparedStatement
		    .executeQuery("SELECT * FROM produto where codigo = "
			    + codigo + ";");
	    try {
		if (resultSet.next()) {
		    final String nome = resultSet.getString("nome");
		    Timestamp data = resultSet.getTimestamp("data_alteracao",
			    Calendar.getInstance(TimeZone.getTimeZone("UTC")));
		    p = new Produto(nome, codigo, data.getTime());
		}
	    } finally {
		resultSet.close();
	    }
	} finally {
	    preparedStatement.close();
	}
	return p;
    }

    public void excluirProduto(String codigo) throws Throwable {
	Statement preparedStatement = ConnectionFactory.get().createStatement();
	try {
	    preparedStatement
		    .executeUpdate("DELETE FROM produto WHERE codigo = "
			    + codigo + ";");
	} finally {
	    preparedStatement.close();
	}
    }

    @Override
    public void criarTabela1() throws Throwable {

    }

    @Override
    public void insereProduto(Produto produto) throws Throwable {
	String nome = produto.getNome();
	long codigo = produto.getCodigo();
	long dataAlteracao = produto.getDataAlteracao();
	Statement preparedStatement = ConnectionFactory.get().createStatement();
	try {
	    preparedStatement
		    .executeUpdate("INSERT INTO produto (nome,codigo,data_alteracao) VALUES('"
			    + nome
			    + "',"
			    + codigo
			    + ",'"
			    + new Timestamp(dataAlteracao).toString() + "');");
	} finally {
	    preparedStatement.close();
	}
    }

    @Override
    public long count(Calendar data) throws Throwable {
	preparedStatement = ConnectionFactory.get().createStatement();
	resultSet = preparedStatement
		.executeQuery("SELECT count(*) FROM produto WHERE data_alteracao > '"
			+ new Timestamp(data.getTimeInMillis()).toString()
			+ "';");
	if (resultSet.next()) {
	    final int count = resultSet.getInt(1);
	    return count;
	}
	return 0;
    }

    @Override
    public ResultSetProcessor<Produto> getPendencias(final Calendar data)
	    throws Throwable {
	final Statement preparedStatement = ConnectionFactory.get()
		.createStatement();
	final ResultSet resultSet = preparedStatement
		.executeQuery("SELECT * FROM produto WHERE data_alteracao > '"
			+ new Timestamp(data.getTimeInMillis()).toString()
			+ "';");
	return new ResultSetProcessor<Produto>() {
	    @Override
	    public Produto process() throws Throwable {
		if (resultSet.next()) {
		    final String nome = resultSet.getString("nome");
		    final long codigo = resultSet.getLong("codigo");
		    final Timestamp data = resultSet
			    .getTimestamp("data_alteracao");
		    return new Produto(nome, codigo, data.getTime());
		}
		resultSet.close();
		preparedStatement.close();
		return null;
	    }
	};
    }
}
